From 375ccb28b329d28453b9cf8de66be7d000640736 Mon Sep 17 00:00:00 2001 From: Kristian Rietveld Date: Fri, 12 Dec 2003 20:08:58 +0000 Subject: [PATCH] Combo box flipping support. Fri Dec 12 21:00:12 2003 Kristian Rietveld Combo box flipping support. * gtk/gtkcombobox.c (gtk_combo_box_menu_position), (gtk_combo_box_size_allocate): support RTL flipping (#126518, patch from Matthias Clasen), (gtk_combo_box_popup): fix popup window alignment if there's a cell view frame visible (#126518, patch from Semion Chichelnitsky). * gtk/gtkcellview.c (gtk_cell_view_expose): support RTL flipping (#128348, patch from Semion Chichelnitsky). --- ChangeLog | 13 ++++++++++ ChangeLog.pre-2-10 | 13 ++++++++++ ChangeLog.pre-2-4 | 13 ++++++++++ ChangeLog.pre-2-6 | 13 ++++++++++ ChangeLog.pre-2-8 | 13 ++++++++++ gtk/gtkcellview.c | 15 +++++++++--- gtk/gtkcombobox.c | 61 +++++++++++++++++++++++++++++++++++++--------- 7 files changed, 126 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index f3f2ca99bc..a33f30f417 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +Fri Dec 12 21:00:12 2003 Kristian Rietveld + + Combo box flipping support. + + * gtk/gtkcombobox.c (gtk_combo_box_menu_position), + (gtk_combo_box_size_allocate): support RTL flipping (#126518, + patch from Matthias Clasen), + (gtk_combo_box_popup): fix popup window alignment if there's a + cell view frame visible (#126518, patch from Semion Chichelnitsky). + + * gtk/gtkcellview.c (gtk_cell_view_expose): support RTL flipping + (#128348, patch from Semion Chichelnitsky). + Fri Dec 12 01:13:34 2003 Matthias Clasen * examples/gtkdial/gtkdial.c: diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index f3f2ca99bc..a33f30f417 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,16 @@ +Fri Dec 12 21:00:12 2003 Kristian Rietveld + + Combo box flipping support. + + * gtk/gtkcombobox.c (gtk_combo_box_menu_position), + (gtk_combo_box_size_allocate): support RTL flipping (#126518, + patch from Matthias Clasen), + (gtk_combo_box_popup): fix popup window alignment if there's a + cell view frame visible (#126518, patch from Semion Chichelnitsky). + + * gtk/gtkcellview.c (gtk_cell_view_expose): support RTL flipping + (#128348, patch from Semion Chichelnitsky). + Fri Dec 12 01:13:34 2003 Matthias Clasen * examples/gtkdial/gtkdial.c: diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index f3f2ca99bc..a33f30f417 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,16 @@ +Fri Dec 12 21:00:12 2003 Kristian Rietveld + + Combo box flipping support. + + * gtk/gtkcombobox.c (gtk_combo_box_menu_position), + (gtk_combo_box_size_allocate): support RTL flipping (#126518, + patch from Matthias Clasen), + (gtk_combo_box_popup): fix popup window alignment if there's a + cell view frame visible (#126518, patch from Semion Chichelnitsky). + + * gtk/gtkcellview.c (gtk_cell_view_expose): support RTL flipping + (#128348, patch from Semion Chichelnitsky). + Fri Dec 12 01:13:34 2003 Matthias Clasen * examples/gtkdial/gtkdial.c: diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index f3f2ca99bc..a33f30f417 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,16 @@ +Fri Dec 12 21:00:12 2003 Kristian Rietveld + + Combo box flipping support. + + * gtk/gtkcombobox.c (gtk_combo_box_menu_position), + (gtk_combo_box_size_allocate): support RTL flipping (#126518, + patch from Matthias Clasen), + (gtk_combo_box_popup): fix popup window alignment if there's a + cell view frame visible (#126518, patch from Semion Chichelnitsky). + + * gtk/gtkcellview.c (gtk_cell_view_expose): support RTL flipping + (#128348, patch from Semion Chichelnitsky). + Fri Dec 12 01:13:34 2003 Matthias Clasen * examples/gtkdial/gtkdial.c: diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index f3f2ca99bc..a33f30f417 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,16 @@ +Fri Dec 12 21:00:12 2003 Kristian Rietveld + + Combo box flipping support. + + * gtk/gtkcombobox.c (gtk_combo_box_menu_position), + (gtk_combo_box_size_allocate): support RTL flipping (#126518, + patch from Matthias Clasen), + (gtk_combo_box_popup): fix popup window alignment if there's a + cell view frame visible (#126518, patch from Semion Chichelnitsky). + + * gtk/gtkcellview.c (gtk_cell_view_expose): support RTL flipping + (#128348, patch from Semion Chichelnitsky). + Fri Dec 12 01:13:34 2003 Matthias Clasen * examples/gtkdial/gtkdial.c: diff --git a/gtk/gtkcellview.c b/gtk/gtkcellview.c index cf3933442e..b307573d60 100644 --- a/gtk/gtkcellview.c +++ b/gtk/gtkcellview.c @@ -403,6 +403,7 @@ gtk_cell_view_expose (GtkWidget *widget, GList *i; GtkCellView *cellview; GdkRectangle area; + gboolean rtl = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL); cellview = GTK_CELL_VIEW (widget); @@ -439,7 +440,7 @@ gtk_cell_view_expose (GtkWidget *widget, area = widget->allocation; /* we draw on our very own window, initialize x and y to zero */ - area.x = widget->allocation.x; + area.x = widget->allocation.x + (rtl ? widget->allocation.width : 0); area.y = widget->allocation.y; /* PACK_START */ @@ -454,6 +455,8 @@ gtk_cell_view_expose (GtkWidget *widget, continue; area.width = info->real_width; + if (rtl) + area.x -= area.width; gtk_cell_renderer_render (info->cell, event->window, @@ -461,9 +464,12 @@ gtk_cell_view_expose (GtkWidget *widget, /* FIXME! */ &area, &area, &event->area, 0); - area.x += info->real_width; + if (!rtl) + area.x += info->real_width; } + area.x = rtl ? widget->allocation.x : (widget->allocation.x + widget->allocation.width); + /* PACK_END */ for (i = cellview->priv->cell_list; i; i = i->next) { @@ -476,13 +482,16 @@ gtk_cell_view_expose (GtkWidget *widget, continue; area.width = info->real_width; + if (!rtl) + area.x -= area.width; gtk_cell_renderer_render (info->cell, widget->window, widget, /* FIXME ! */ &area, &area, &event->area, 0); - area.x += info->real_width; + if (rtl) + area.x += info->real_width; } return FALSE; diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c index 1e5674e45b..1155a46d5a 100644 --- a/gtk/gtkcombobox.c +++ b/gtk/gtkcombobox.c @@ -694,7 +694,10 @@ gtk_combo_box_menu_position (GtkMenu *menu, gtk_widget_size_request (GTK_WIDGET (menu), &req); - *x = sx + child->allocation.width - req.width; + if (gtk_widget_get_direction (GTK_WIDGET (combo_box)) == GTK_TEXT_DIR_RTL) + *x = sx; + else + *x = sx + child->allocation.width - req.width; *y = sy + child->allocation.height; if (GTK_WIDGET_NO_WINDOW (child)) @@ -742,6 +745,15 @@ gtk_combo_box_popup (GtkComboBox *combo_box) gdk_window_get_origin (sample->window, &x, &y); + + if (combo_box->priv->cell_view_frame) + { + x -= GTK_CONTAINER (combo_box->priv->cell_view_frame)->border_width + + GTK_WIDGET (combo_box->priv->cell_view_frame)->style->xthickness; + width += 2 * (GTK_CONTAINER (combo_box->priv->cell_view_frame)->border_width + + GTK_WIDGET (combo_box->priv->cell_view_frame)->style->xthickness); + } + gtk_widget_set_size_request (combo_box->priv->popup_window, width, -1); @@ -939,6 +951,7 @@ gtk_combo_box_size_allocate (GtkWidget *widget, GtkComboBox *combo_box = GTK_COMBO_BOX (widget); GtkAllocation child; GtkRequisition req; + gboolean is_rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL; widget->allocation = *allocation; @@ -960,36 +973,54 @@ gtk_combo_box_size_allocate (GtkWidget *widget, child.x = allocation->x + border_width + 1 + xthickness + 2; child.y = allocation->y + border_width + 1 + ythickness + 2; - width = allocation->width - (border_width + 1 + ythickness * 2 + 4); + width = allocation->width - (border_width + 1 + xthickness * 2 + 4); /* handle the childs */ gtk_widget_size_request (combo_box->priv->arrow, &req); child.width = req.width; child.height = allocation->height - 2 * (child.y - allocation->y); - child.x += width - req.width; + if (!is_rtl) + child.x += width - req.width; gtk_widget_size_allocate (combo_box->priv->arrow, &child); - + if (is_rtl) + child.x += req.width; gtk_widget_size_request (combo_box->priv->separator, &req); child.width = req.width; - child.x -= req.width; + if (!is_rtl) + child.x -= req.width; gtk_widget_size_allocate (combo_box->priv->separator, &child); - child.width = child.x; - child.x = allocation->x + border_width + 1 + xthickness + 2; - child.width -= child.x; + if (is_rtl) + { + child.x += req.width; + child.width = allocation->x + allocation->width + - (border_width + 1 + xthickness + 2) - child.x; + } + else + { + child.width = child.x; + child.x = allocation->x + border_width + 1 + xthickness + 2; + child.width -= child.x; + } gtk_widget_size_allocate (GTK_BIN (widget)->child, &child); } else { gtk_widget_size_request (combo_box->priv->button, &req); - child.x = allocation->x + allocation->width - req.width; + if (is_rtl) + child.x = allocation->x; + else + child.x = allocation->x + allocation->width - req.width; child.y = allocation->y; child.width = req.width; child.height = allocation->height; gtk_widget_size_allocate (combo_box->priv->button, &child); - child.x = allocation->x; + if (is_rtl) + child.x = allocation->x + req.width; + else + child.x = allocation->x; child.y = allocation->y; child.width = allocation->width - req.width; gtk_widget_size_allocate (GTK_BIN (widget)->child, &child); @@ -1001,14 +1032,20 @@ gtk_combo_box_size_allocate (GtkWidget *widget, /* button */ gtk_widget_size_request (combo_box->priv->button, &req); - child.x = allocation->x + allocation->width - req.width; + if (is_rtl) + child.x = allocation->x; + else + child.x += allocation->x + allocation->width - req.width; child.y = allocation->y; child.width = req.width; child.height = allocation->height; gtk_widget_size_allocate (combo_box->priv->button, &child); /* frame */ - child.x = allocation->x; + if (is_rtl) + child.x = allocation->x + req.width; + else + child.x = allocation->x; child.y = allocation->y; child.width = allocation->width - req.width; child.height = allocation->height; -- 2.30.2